﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bastanteo.Negocio;
using Bastanteo.Persistencia.ADO;
using Bastanteo.Domain;
using System.Data.SqlClient; 


namespace Bastanteo.Persistencia.ADO
{
    public class CargoDAO :ICargoDAO
    {
        public Domain.Cargo Crear(Domain.Cargo entidad)
        {
            using (SqlConnection cn = new SqlConnection(Conexion.ObtenerCadena()))
            {
                int _NuevoCodigo = GenerarNuevoCodigo();
                cn.Open();
                SqlCommand cmd = new SqlCommand("insert into Cargo values (@CargoId, @CargoDescripcion)", cn);
                cmd.Parameters.AddWithValue("@CargoId", _NuevoCodigo);
                cmd.Parameters.AddWithValue("@CargoDescripcion", entidad.CargoDescripcion);
                cmd.ExecuteNonQuery();

            }

            return Obtener(entidad.CargoId); 
        }

        public Domain.Cargo Obtener(int id)
        {
            Cargo newCargo = new Cargo();

            using (SqlConnection cn = new SqlConnection(Conexion.ObtenerCadena()))
            {
                cn.Open();
                SqlCommand cmd = new SqlCommand("Select * from Cargo where CargoId=@CargoId", cn);
                cmd.Parameters.AddWithValue("@CargoId", id);
                SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    newCargo.CargoId = (int)reader["CargoId"];
                    newCargo.CargoDescripcion = (string)reader["CargoDescripcion"];
                }

            }

            return newCargo;
        }

        public Domain.Cargo Modificar(Domain.Cargo entidad)
        {
            Cargo cargo = new Cargo();

            using (SqlConnection cn = new SqlConnection(Conexion.ObtenerCadena()))
            {
                cn.Open();
                SqlCommand cmd = new SqlCommand("update Cargo set  CargoDescripcion=@CargoDescripcion where CargoId=@CargoId", cn);
                cmd.Parameters.AddWithValue("@CargoId", entidad.CargoId);
                cmd.Parameters.AddWithValue("@CargoDescripcion", entidad.CargoDescripcion);
                cmd.ExecuteNonQuery();

                cargo = Obtener(entidad.CargoId);
            }

            return cargo; 
        }

        public void Eliminar(Domain.Cargo entidad)
        {
            string _Sentencia = "Delete from Cargo where CargoId=@CargoId";
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CargoId", entidad.CargoId));
                    _Comando.ExecuteNonQuery();
                }
            }

        }

        //Metodos Listar
        public ICollection<Cargo> Listar()
        {
            string _Sentencia = "SELECT CargoID, CargoDescripcion FROM Cargo";
            ICollection<Cargo> cargoEncontrados = new List<Cargo>();
            Cargo cargoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            cargoEncontrado = new Cargo();
                            cargoEncontrado.CargoId = _Resultado.GetInt32(0);
                            cargoEncontrado.CargoDescripcion = (String)_Resultado["CargoDescripcion"];
                            cargoEncontrados.Add(cargoEncontrado);
                        }
                    }
                }
            }
            return cargoEncontrados;
        }
        public ICollection<Cargo> ListarXNombre(string nombre)
        {
            string _Sentencia = "SELECT CargoId, CargoDescripcion FROM Cargo WHERE CargoDescripcion LIKE '%'+@nombre+'%'";
            ICollection<Cargo> cargoEncontrados = new List<Cargo>();
            Cargo cargoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            cargoEncontrado = new Cargo();
                            cargoEncontrado.CargoId = _Resultado.GetInt32(0);
                            cargoEncontrado.CargoDescripcion = (String)_Resultado["CargoDescripcion"];
                            cargoEncontrados.Add(cargoEncontrado);
                        }
                    }
                }
            }
            return cargoEncontrados;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(cargoid) FROM Cargo";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(Conexion.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}